#include<iostream>
#include<assert.h>

using namespace std;

template<class T>
class Stack{
public:
    //1.构造
    Stack(int n=10)
        :arr(new T[n])
        ,_top(0)
        ,_capacity(n)
    {
        ;
    }

    //0.判断栈是否为空：
    bool _Empty()    {
        assert(arr!=nullptr);
        if(_top==0)
        {
            return true;
        }
        else{return false;}
    }
    //1.入：
    void push(T x)
    {
        assert(arr!=nullptr);

        if(_top == _capacity)
        {
            _capacity*=2;
            arr = (T*)realloc(arr,sizeof(T)*(_capacity));
            cout<<"扩容成功"<<endl;
        }
        else
        {
            arr[_top++]=x;
        }
    }
    
    //2.出：
    void pop()
    {
        assert(arr!=nullptr);
        if(!_Empty())
        {
            arr[_top]=0;
            _top--;
        }
        else
        {
            cout<<"没有数据可以去除了"<<endl;
        }
    }

    //3.获取栈顶数据
    T top()
    {
        assert(arr!=nullptr);

        if(!_Empty())
        {
            return arr[_top];
        }
        else 
        {
            return -1;
        }
    }

    //4.获取栈中数据个数：
    int num()
    {
        assert(arr!=nullptr);
        return _top;
    }

    void print()
    {
        assert(arr!=nullptr);

        for(int i=0;i<_top;i++)
        {
            cout<<arr[i]<<"--";
        }
        cout<<"\n";
    }

    ~Stack()
    {
        delete[] arr;
        _top = 0;
        _capacity = 0;
    }

private:
    T* arr;
    int _top;
    int _capacity;
};

int main()
{
    Stack<int> s1(2);

    s1.push(1);
    s1.push(2);
    s1.push(3);
    s1.push(4);
    s1.push(5);
    s1.push(6);

    s1.print();

    s1.pop();
    s1.pop();

    s1.print();

    cout<<"当前栈顶数据:"<<s1.top()<<endl;
    s1.pop();
    s1.print();
    cout<<"当前栈顶数据:"<<s1.top()<<endl;

    cout<<"当前栈中数据个数"<<s1.num()<<endl;
    s1.print();
    return 0;
}
